/**
 * 扫描类
 */
export default class Scanner {
  constructor(templateStr) {
    // 将模板字符串写在实例身上
    this.templateStr = templateStr
    // 指针
    this.pos = 0;
    // 尾巴一开始就是模板字符串的原文
    this.tail = templateStr;
  }

  /**
   * 路过指定内容
   */
  scan(tag) {
    if (this.tail.indexOf(tag) == 0) {
      // tag有多长，比如{{长度是2， 就让指针后裔多少位
      this.pos += tag.length;
      // 改变尾巴从当前指针开始到全部字符
      this.tail = this.templateStr.substring(this.pos)
    }
  }

  /**
   * 让指针进行扫描，直至遇到指定内容，并且返回结束之前路过的文字
   */
  scanUtil(stopTag) {
    // 记录开始执行本方法时pos的值
    const pos_backup = this.pos;
    // 当尾巴的开头不是stopTag时，就说明还没有扫描到stopTag
    while(this.tail.indexOf(stopTag) != 0 && !this.eos()) {
      this.pos++;
      // 改变尾巴从当前指针开始到全部字符
      this.tail = this.templateStr.substring(this.pos)
    }
    return this.templateStr.substring(pos_backup, this.pos);
  }

  // 指针是否已经到头
  eos() {
    return this.pos >= this.templateStr.length
  }
}